package com.guan.mysolutionstudy;

import org.junit.Test;

/**
 * @ClassName LinkedListReverseOutput
 * @Author GuanCary
 * @Date 2020/5/14 15:22
 * @Version 1.0
 * 剑指 offer:输入一个链表，反转链表后，输出链表的所有元素。
 * 思路就是直接把指向下一个元素的指针变为指向前一个的指针
 **/
public class LinkedListReverseOutput {
    public ListNode reverseListNode(ListNode headNode) {
        //反转node,那我们只需要返回最尾部的节点指针pre
        //两个指针指向前后节点
        ListNode next = null;
        ListNode pre = null;
        while (headNode != null) {
            //如果头结点不是空,我们将head的next指针更改为指向前一个
            //首先next指针指向下一个节点
            //将下个节点的地址存入next
            next = headNode.next;
            //将下个节点指向pre
            headNode.next = pre;
            //pre节点就是当前head
            pre = headNode;
            //将当前节点重置为保存的next
            headNode = next;
        }
        //如果headNode为空后跳出
        //回到当前节点的指向pre
        return pre;
    }

    @Test
    public void test() {
        ListNode a = new ListNode(1);
        ListNode b = new ListNode(2);
        ListNode c = new ListNode(3);
        ListNode d = new ListNode(4);
        ListNode e = new ListNode(5);
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = e;
        new LinkedListReverseOutput().reverseListNode(a);
        while (e != null) {
            System.out.println(e.value);
            e = e.next;
        }
    }
}